#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct node {
    ElemType data;
    node *next;
} Lnode, *LinkList;

//尾插法
void list_tail_insert(LinkList &L) {
    LinkList q, p;
    ElemType num;
    L = (LinkList) malloc(sizeof(Lnode));
    q = L;
    scanf("%d", &num);
    while (num != 9999) {
        p = (LinkList) malloc(sizeof(Lnode));
        p->data = num;
        q->next = p;
        q = p;
        scanf("%d", &num);
    }
    p->next = NULL;
}


void GetElem(LinkList L, ElemType pos) {
    ElemType i = 0;
    while (i < pos) {
        L = L->next;
        i++;
    }
    printf("%d", L->data);
}

LinkList Getlocation(LinkList L, ElemType pos) {
    ElemType i = 0;
    if (pos < 0) return NULL;
    while (L && i < pos) {
        L = L->next;
        i++;
    }

    return L;
};

//在第二个位置插入数据
void List_Insert(LinkList L, ElemType pos, ElemType num) {
    L = Getlocation(L, pos - 1);
    LinkList p, q;
    q = L;
    p = (LinkList) malloc(sizeof(Lnode));
    p->data = num;
    p->next = q->next;
    q->next = p;
}
//删除链表某个位置
void Delete_location(LinkList L, ElemType pos) {
    //获取链表言删除的位置的前一个位置
    LinkList q = Getlocation(L, pos - 1);
    LinkList p = q->next;
    q->next = p->next;
    free(p);
}

//链表输出
void Print_list(LinkList L) {
    L = L->next;
    while (L != NULL) {
        printf("%3d", L->data);//打印当前结点数据
        L = L->next;//指向下一个结点
    }
    printf("\n");
}

int main() {
    LinkList L;
    //新建链表
    list_tail_insert(L);
    //找到链表的第2个位置并输出
    GetElem(L, 2);
    printf("\n");
    //在第二个位置插入数据99
    List_Insert(L, 2, 99);
    Print_list(L);
    //删除第4个位置的值
    Delete_location(L, 4);
    //最后输出整个链表
    Print_list(L);
    return 0;
}
